import axios from 'axios';
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios';
import { Session } from '@/utils/storage';
import { message } from 'ant-design-vue'

const service: AxiosInstance = axios.create({
    baseURL: import.meta.env.VITE_API_URL,
    timeout: 30 * 1000, // 全局超时时间
});

// 请求拦截器
service.interceptors.request.use(
    // @ts-ignore
    (config: AxiosRequestConfig) => {
        // 根据业务需求配置请求头token
        const token = Session.getToken();
        if (token && !config.headers?.skipToken) {
            config.headers![CommonHeaderEnum.AUTHORIZATION] = `Bearer ${token}`;
        }

        // 请求报文加密
        // if (config.headers![CommonHeaderEnum.ENC_FLAG]) {
        //     const enc = other.encryption(JSON.stringify(config.data), import.meta.env.VITE_PWD_ENC_KEY);
        //     config.data = {
        //         encryption: enc,
        //     };
        // }

        // 处理完毕，返回config对象
        return config;
    },
    (error) => {
        // 对请求错误进行处理
        return Promise.reject(error);
    }
);

// 约定的业务错误码
// const ERROR_CODE = 1

// 响应拦截器处理函数
const handleResponse = (response: AxiosResponse<any>) => {
    // 返回的数据
    const res = response.data

    // 此处可统一处理业务错误码code
    // if (response.data.code === ERROR_CODE) {
    // 	throw response.data;
    // }

    // 处理Blob数据
    if (res instanceof Blob) {
        if (!res.size) {
            message.warning('文件为空 无法下载')
            return Promise.reject(res)
        }
    }

    // 针对密文返回解密
    // if (response.data.encryption) {
    //     const originData = JSON.parse(other.decryption(response.data.encryption, import.meta.env.VITE_PWD_ENC_KEY));
    //     response.data = originData;
    //     return response.data;
    // }

    return res;
};

// http错误码处理
const httpErrCode: any = {
    404: (res: any) => {
        const { msg } = res
        message.error(msg || 'code:404')
    },
    424: (res: any) => {
        // const {msg} = res
        message.warning('令牌状态已过期，请重新登录')

    },
    503: (res: any) => {
        const { msg } = res
        message.error(msg || 'code:503')
    },
    500: (res: any) => {
        const { msg } = res
        // message.error('code:500')
        message.error(msg || 'code:500')
    }
}

/**
 * 添加 Axios 的响应拦截器，用于全局响应结果处理
 */
service.interceptors.response.use(handleResponse, (error: AxiosError) => {
    const response = error.response
    if (!response) {
        return Promise.reject(error);
    }

    // http网络错误
    const status = response.status
    if (httpErrCode[status]) {
        httpErrCode[status](response.data)
    }

    // 给代码中的try catch 的catch捕获
    return Promise.reject(response.data || response.statusText || 'Axios Error');
});

// 常用header
export enum CommonHeaderEnum {
    'TENANT_ID' = 'TENANT-ID',
    'ENC_FLAG' = 'Enc-Flag',
    'AUTHORIZATION' = 'Authorization',
}

// 导出 axios 实例
export default service;
